package com.fy.fyai.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fy.fyai.model.entity.AiChatConversation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;

/**
 * AI聊天会话Mapper接口
 * @author fwq
 * @date 2025-10-24
 */
@Mapper
public interface AiChatConversationMapper extends BaseMapper<AiChatConversation> {

    /**
     * 向会话追加新消息（使用PostgreSQL JSONB操作）
     * @param conversationId 会话ID
     * @param newMessage 新消息的JSON字符串
     * @return 影响行数
     */
    @Update("UPDATE ai_chat_conversation SET " +
            "message_content = message_content || #{newMessage}::jsonb, " +
            "last_message_time = NOW(), " +
            "update_time = NOW() " +
            "WHERE conversation_id = #{conversationId}")
    int appendMessage(@Param("conversationId") String conversationId, @Param("newMessage") String newMessage);

    /**
     * 获取会话的消息内容（JSON字符串）
     * @param conversationId 会话ID
     * @return JSON字符串
     */
    @Select("SELECT message_content FROM ai_chat_conversation WHERE conversation_id = #{conversationId}")
    String getMessageContent(@Param("conversationId") String conversationId);

    /**
     * 初始化会话消息（设置第一条消息）
     * @param conversationId 会话ID
     * @param firstMessage 第一条消息的JSON字符串
     * @return 影响行数
     */
    // @Update 是 MyBatis 的注解，用于标识这是一条更新语句，注解内的字符串是具体的 SQL 脚本
    @Update("UPDATE ai_chat_conversation SET " +  // 第一部分：指定要更新的表名，以及开始设置字段值
            "message_content = #{firstMessage}::jsonb, " +  // 第二部分：更新 message_content 字段
            "last_message_time = NOW(), " +  // 第三部分：更新 last_message_time 字段
            "update_time = NOW() " +  // 第四部分：更新 update_time 字段
            "WHERE id = #{sessionId}")  // 第五部分：指定更新的条件（只更新符合条件的行）
    int initMessageContent(@Param("conversationId") String conversationId, @Param("firstMessage") String firstMessage);

    /**
     * 直接在数据库侧(JSONB)获取指定会话的最近K条消息（按 send_time 排序）
     * 返回每条消息的JSON字符串，由上层再反序列化为 MessageContent
     */
    @Select("""
            SELECT jsonb_build_object(
                       'role',          elem->>'role',
                       'content',       elem->>'content',
                       'send_time',     elem->>'send_time',
                       'tokens',        COALESCE((elem->>'tokens')::int, 0),
                       'content_summary', elem->>'content_summary',
                       'attachments',   COALESCE(elem->'attachments', '[]'::jsonb)
                   )::text AS msg_json
            FROM ai_chat_conversation c
                 CROSS JOIN LATERAL jsonb_array_elements(c.message_content) AS elem
            WHERE c.conversation_id = #{conversationId}
            ORDER BY (elem->>'send_time')::timestamptz DESC
            LIMIT #{lastN}
            """)
    List<String> selectTopKMessageJson(@Param("conversationId") String conversationId,
                                       @Param("lastN") int lastN);
}
